


#您子滴逗你故意存储系统文件爱你必须是以下子类 django.core.files.storage.Srorage

from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.utils.deconstruct import deconstructible



from mall import settings

@deconstructible
class Mystorage(Storage):
    def __init__(self, path=None, ip=None):
        if not path:
            path = settings.FDFS_CLIENT_CONF
            self.path = path

        if not ip:
            ip = settings.FDFS_URL
            self.ip = ip

    #Django 必须能够在没有任何参数的情况下实例化您的存储系统
    #这意味着任何设置都因该来自djang.conf.settings
    # def __init__(self,option=None):
    #     if not option:
    #         option = settings.CUSTOOM_STORAGE_OPTIONS
    #3您的存储类必须实现_open()和_save() 方法
    #以及适用于您的存储类的任何其他方法
    #打开文件采用的是 http://ip:port/file_id
    #所以这个方法我们不需要实现
    def _open(self,name,mode='rb'):
        pass
    #save 保存图片
    #采用 FastDFS 实现图片的保存
    def _cave(self,name,content,max_length=None):
        #1创建Fdfs的客户端
        client = Fdfs_client("utils/fastdfs/client.conf")
        #注意点
        #name 图片的名字
        #content 图片的二进制内容
        #buffer  上传二进制
        data = content.read()
        result = client.upload_by_buffer(data)
        """
                {'Group name': 'group1',
                'Remote file_id': 'group1/M00/00/02/wKjlhVvGjNWAbjq9AAUJgyD1NQ4209.jpg',
                'Local file name': '/home/python/Desktop/images/0.jpg',
                'Storage IP': '192.168.229.133',
                'Uploaded size': '322.00KB',
                'Status': 'Upload successed.'}

                """


        #2进行文件上传

        #3判断返回结果
        if result.get('Staus') == 'Upload successed.':
            #成功的
            # 4获取file_id
            file_id = result.get('Remote file_id')
        else:
            #失败
            raise Exception('上传失败')


        #5 将file-id 返回给系统
        return file_id



    # 判断是否存在
    # 上传重复的图片不会出现覆盖的情况，所以 直接返回False
    # 不需要判断 是否存在
    def exists(self, name):

        return False


    def url(self, name):
        # name --> file_id -->group1/M00/00/02/wKjlhVvGjNWAbjq9AAUJgyD1NQ4209.jpg

        # 默认只会把 name返回回去，但是 完整的url 是需要我们进行 http://ip:port + name 进行拼接的

        # return 'http://192.168.229.133:8888/' + name
        # return settings.FDFS_URL + name
        return self.ip + name


